// 字面量类型声明
let a: 10;
a = 10;
// 联合类型
let b: 'male' | 'female'
let c: string | boolean
c = true;
c = 'hello';
// 关闭当前变量的ts
// 显示any
let d: any;
// 隐式any
// let d;
d = 10;
d = 'hello';
d = true;
// 未知类型
let e: unknown;
e = 10;
e = 'hello';
e = true;
// d的类型是any,可以赋值给任意变量
let s: string;
s = d;
// unknown实质是类型安全的any 不能直接赋值给其他变量 要判断类型再赋值
// e = 'hello';
// s = e 
// 判断类型再赋值
if (typeof e === "string") {
    s = e;
}
// 类型断言 告诉解析器变量的实际类型
s = e as string;
s = <string>e
// 函数没有返回值或undefined
function aaa(): void {
    return null;
    // return undefined;
}
// never 永远没有返回结果
function bbb(): never {
    throw new Error('报错了')
}
// 基础数据类型
let msg: string = 'hello';
msg = '1';
let num: number = 0;
num = 2;
let flag: boolean = false;
flag = true
let isFlag = false;
isFlag = true;
// 引用数据类型
const arr: string[] = [];
arr.push('hello')
const arr1: string[][] = [
    ['hello', 'world'],
    ['hello', 'world'],
    ['hello', 'world'],
    ['hello', 'world']
];

// 对象
interface Person {
    id: number;
    name: string;
    age?: number;
    children?: Person[];
    sayHi?(msg: string): number;
}
const data: Person[] = [];
data.push({
    id: 1,
    name: '1',
    age: 35,
    sayHi(a) {
        return 123;
    }
})
data.push({
    id: 2,
    name: 'lili',
    sayHi(a) {
        return 123
    }
})
// 函数
function fn(msg: string): number {
    console.log(msg);
    return 1;
}
// 泛型
function f1<T>(a: T): T {
    const xx: T = a;
    return xx;
}
const res = f1<Person>({
    id: 1,
    name: 'zs',
});